In many testing scenarios, it is difficult to determine how each of several different components of a software system is affecting performance. For example, a software developer may be unable to determine whether a new application is responding too slowly due to performance problems within the application itself, network congestion affecting the application's interactions with a web server from which the application obtains necessary data, or a sluggish database that the web server interacts with. Since each of these components may be implemented independently, it is difficult to be able to test all of the components in a manner that captures the interactions between the components. Furthermore, since some of the components may not allow modification of their code for testing purposes, this difficulty may be exacerbated.
This complexity can also frustrate testing scenarios in which the person performing the testing is not the person responsible for fixing defects found in the testing process. In a typical scenario, a quality assurance (QA) analyst interacts with the software under test. Whenever the QA analyst detects that the software is not functioning properly, the QA analyst documents the error and submits a report to the development personnel. Unfortunately, such defect reports often lack enough information and details to enable the development team to reproduce and/or fix the defect. This leads to frustration and wasted time and effort on the parts of both QA and development personnel.